module control(din, clk, rst, arload, pcload, pcinc, drload, acload, acinc, irload, alusel, membus, pcbus, drbus, read);
input [1:0] din;
input clk, rst;
output arload, pcload, pcinc, drload, acload, acinc, irload, alusel, membus, pcbus, drbus, read;

wire clr, inc, ld; 
wire [3:0] cnt;
reg [3:0] counter_out;
reg fetch1, fetch2, fetch3, add1, add2, and1, and2, jmp1, inc1;
assign arload=fetch1 || fetch3;
assign pcload=jmp1;
assign pcinc=fetch2;
assign drload= fetch2 || and1 || add1;
assign acload=add2 || and2;
assign acinc=inc1;
assign irload= fetch3;
assign alusel=and2;
assign membus=fetch2 || and1 || add1;
assign pcbus=fetch1;
assign drbus=fetch3 || and2 || add2 || jmp1;
assign read= fetch2 || add1 || and1; 
assign ld=fetch3;
assign inc=fetch1||fetch2 ||add1||and1;
assign clr=and2||add2||inc1||jmp1;

assign cnt={1'b1, din[1:0],1'b0}; 

always @(posedge clk or posedge rst)
	begin
		if(rst)
			/*begin
				arload=0; pcload=0; pcinc=0; drload=0; 
				acload=0; acinc=0; irload=0; alusel=0;
				membus=0; pcbus=0; drbus=0; read=0;
			end	
			*/
			begin
				fetch1=0; 
				fetch2=0;
				fetch3=0;
				add1=0;
				add2=0;
				and1=0;
				and2=0;
				jmp1=0;
				inc1=0;	
				counter_out=0;
			end
	
	if(clr)
	counter_out=0;
	if(ld)
	counter_out=cnt;
	else if(inc)
	counter_out=counter_out+1;
	
	case(counter_out)
	0:  begin
		fetch1=1; 
				fetch2=0;
				fetch3=0;
				add1=0;
				add2=0;
				and1=0;
				and2=0;
				jmp1=0;
				inc1=0;
		end
	1:  begin
		fetch2=1;
		fetch1=0; 
				
				fetch3=0;
				add1=0;
				add2=0;
				and1=0;
				and2=0;
				jmp1=0;
				inc1=0;
		end
	2:  begin
		fetch3=1;
		fetch1=0; 
				fetch2=0;
				add1=0;
				add2=0;
				and1=0;
				and2=0;
				jmp1=0;
				inc1=0;
		end
	8:  begin
		add1=1;
		fetch1=0; 
				fetch2=0;
				fetch3=0;
				add2=0;
				and1=0;
				and2=0;
				jmp1=0;
				inc1=0;
		end
	9:  begin
		add2=1;
		fetch1=0; 
				fetch2=0;
				fetch3=0;
				add1=0;
			
				and1=0;
				
				jmp1=0;
				inc1=0;
		end
	10: begin
		and1=1;
		fetch1=0; 
				fetch2=0;
				fetch3=0;
				add1=0;
				add2=0;
			
				and2=0;
				jmp1=0;
				inc1=0;
		end
	11: begin
		and2=1;
		fetch1=0; 
				fetch2=0;
				fetch3=0;
				add1=0;
				add2=0;
				and1=0;
				
				jmp1=0;
				inc1=0;
		end
	12: begin
		jmp1=1;
		fetch1=0; 
				fetch2=0;
				fetch3=0;
				add1=0;
				add2=0;
				and1=0;
				and2=0;
				
				inc1=0;
		end
	14: begin
		inc1=1;
		fetch1=0; 
				fetch2=0;
				fetch3=0;
				add1=0;
				add2=0;
				and1=0;
				and2=0;
				jmp1=0;
		end
	/*default: begin
		fetch1=1; 
				fetch2=0;
				fetch3=0;
				add1=0;
				add2=0;
				and1=0;
				and2=0;
				jmp1=0;
				inc1=0;	

	end	
	*/	
	endcase
	
	end
	
endmodule
